package org.example;

import java.util.*;


//public class Main {
//    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        int N, M;
//        N = scanner.nextInt();
//        M = scanner.nextInt();
//        int[] parentCount = new int[N];
//        boolean[][] graph = new boolean[N][N];
//        for (int i = 0; i < M; i++) {
//            int u = scanner.nextInt();
//            int v = scanner.nextInt();
//            graph[u][v] = true;
//            parentCount[v]++;
//        }
//
//        boolean[] visited = new boolean[N];
//        List<Integer> ans = new ArrayList<>();
//        for (int i = 0; i < N; i++) {
//            //找到一个可以运行的结点
//            int u = -1;
//            for (int j = 0; j < N; j++) {
//                if (!visited[j] && parentCount[j] == 0) {
//                    u = j;
//                    break;
//                }
//            }
//            if (u == -1) {
//                System.out.print(-1);
//                return;
//            }
//            ans.add(u);
//            visited[u] = true;
//
//            //更新依赖
//            for (int j = 0; j < N; j++) {
//                if (!visited[j] && graph[u][j]) {
//                    parentCount[j]--;
//                }
//            }
//        }
//        for (int i = 0; i < ans.size(); i++) {
//            System.out.print(ans.get(i));
//            if (i < ans.size() - 1) {
//                System.out.print(' ');
//            }
//        }
//    }
//}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N, M;
        N = scanner.nextInt();
        M = scanner.nextInt();
        int[] inDegree = new int[N];
        List<List<Integer>> graph = new ArrayList<>(N);
        for (int i = 0; i < N; i++) {
            graph.add(new ArrayList<>());
        }
        for (int i = 0; i < M; i++) {
            int u = scanner.nextInt();
            int v = scanner.nextInt();
            graph.get(u).add(v);
            inDegree[v]++;
        }

        Queue<Integer> queue = new ArrayDeque<>();
        for (int i = 0; i < N; i++) {
            if (inDegree[i] == 0) {
                queue.offer(i);
            }
        }
        List<Integer> ans = new ArrayList<>();
        while (!queue.isEmpty()) {
            int u = queue.poll();
            ans.add(u);
            for (int v : graph.get(u)) {
                inDegree[v]--;
                if (inDegree[v] == 0) {
                    queue.offer(v);
                }
            }
        }

        if (ans.size() != N) {
            System.out.println(-1);
            return;
        }
        for (int i = 0; i < ans.size(); i++) {
            System.out.print(ans.get(i));
            if (i < ans.size() - 1) {
                System.out.print(' ');
            }
        }
    }
}